package com.order.manager.service.impl;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.page.PageMethod;
import com.order.manager.Model.CollectInfo;
import com.order.manager.Model.ShopInfo;
import com.order.manager.mapper.ShopInfoMapper;
import com.order.manager.service.ShopInfoService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 24862
 * @description 针对表【shop_info】的数据库操作Service实现
 * @createDate 2024-04-08 15:32:34
 */
@Service
public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> implements ShopInfoService {

    /**
     * 店铺信息数据访问对象
     */
    @Resource
    ShopInfoMapper shopInfoMapper;

    /**
     * 收藏信息服务
     */
    @Resource
    CollectInfoServiceImpl collectInfoService;

    /**
     * 用户信息服务
     */
    @Resource
    UserInfoServiceImpl userInfoService;

    /**
     * 按店铺名称查询有效店铺列表（分页）
     *
     * @param page      页码
     * @param item      每页数量
     * @param shopName  店铺名称关键词
     * @return 分页包装的店铺信息列表，包含店铺收藏数
     *
     * @implNote 实现逻辑：
     * 1. 按店铺名称模糊查询，且筛选营业状态为1、店铺状态为3的有效店铺
     * 2. 为每个店铺设置shopMasterId字段为该店铺的收藏数量
     * 3. 返回分页结果
     *
     * @apiNote 状态码说明：
     * business_state=1 表示"营业中"，shop_state=3 表示"已审核通过"
     */
    @Override
    //PageInfo：这是一个分页工具类，通常在基于MyBatis的项目中用于封装分页查询结果
    public PageInfo<ShopInfo> queryByShopName(int page, int item, String shopName) {
        // 开启分页功能
        PageMethod.startPage(page, item);

        // 构建查询条件：店铺名称模糊匹配，且营业状态为1、店铺状态为3
        // 查询符合条件的店铺列表
        List<ShopInfo> shopInfos = shopInfoMapper.selectList(
                // 构建查询条件：店铺名称模糊匹配且营业状态为1（营业中）、店铺状态为3（已审核通过）
                new QueryWrapper<ShopInfo>()
                        // 模糊查询：店铺名称包含指定关键词
                        .like("shop_name", shopName)
                        // 等值查询：营业状态为1（1表示营业中）
                        .eq("business_state", 1)
                        // 等值查询：店铺状态为3（3表示已审核通过）
                        .eq("shop_state", 3)
        );
        // 遍历店铺列表，为每个店铺设置收藏数量（通过shopMasterId字段返回）
        shopInfos.forEach(el ->
                // 设置店铺的shopMasterId字段为该店铺的收藏数量（存在命名语义不一致问题）
                el.setShopMasterId(
                        // 将收藏数量转换为字符串（原字段设计为ID，但实际存储收藏数）
                        String.valueOf(
                                // 查询collect_info表中collect_shop_id等于当前店铺ID的记录数
                                collectInfoService.count(
                                        new QueryWrapper<CollectInfo>()
                                                // 构建查询条件：collect_shop_id = 当前店铺ID
                                                .eq("collect_shop_id", el.getShopId())
                                )
                        )
                )
        );
        // new PageInfo<>(orderForSenders) 会自动：
        //获取当前页数据（orderForSenders）
        //计算总记录数（通过执行 SELECT COUNT(*)）
        //计算总页数、当前页码等信息
        return new PageInfo<>(shopInfos);
    }

    /**
     * 按店铺名称和用户收藏查询店铺列表（分页）
     *
     * @param page      页码
     * @param item      每页数量
     * @param shopName  店铺名称关键词
     * @param uuid      用户ID
     * @return 分页包装的店铺信息列表，包含店铺收藏数
     *
     * @implNote 实现逻辑：
     * 1. 调用Mapper自定义方法queryByUserIdShopName查询店铺
     * 2. 为每个店铺设置shopMasterId字段为该店铺的收藏数量
     * 3. 返回分页结果
     *
     * @see ShopInfoMapper#queryByUserIdShopName(String, String)
     */
    @Override
   // PageInfo：这是一个分页工具类，通常在基于MyBatis的项目中用于封装分页查询结果
    public PageInfo<ShopInfo> queryByShopAndUserCollect(int page, int item, String shopName, String uuid) {
        // 开启分页功能
        PageMethod.startPage(page, item);

        // 调用Mapper自定义方法查询店铺（包含用户收藏状态）
        List<ShopInfo> shopInfos = shopInfoMapper.queryByUserIdShopName(shopName, uuid);
        /*
        1. forEach 方法对集合中的每个元素执行指定操作
        2.el ->调用 setShopMasterId 方法修改店铺的店主 ID 字段
        3.String.valueOf将统计得到的收藏次数转换为字符串。
        */
        // 为每个店铺设置收藏数量（通过shopMasterId字段返回）
        shopInfos.forEach(el ->
                el.setShopMasterId(String.valueOf(
                        collectInfoService.count(new QueryWrapper<CollectInfo>()
                                .eq("collect_shop_id", el.getShopId())
                        ))
                )
        );
        // new PageInfo<>(orderForSenders) 会自动：
        //获取当前页数据（orderForSenders）
        //计算总记录数（通过执行 SELECT COUNT(*)）
        //计算总页数、当前页码等信息
        return new PageInfo<>(shopInfos);
    }

    /**
     * 按校区查询店铺列表（分页）
     *
     * @param page      页码
     * @param item      每页数量
     * @return 分页包装的店铺信息列表，其中shopMasterId字段为店主信息的JSON字符串
     *
     * @implNote 实现逻辑：
     * 1. 查询所有店铺信息（未添加校区过滤条件，需根据实际业务补充）
     * 2. 为每个店铺设置shopMasterId字段为店主用户信息的JSON字符串
     * 3. 返回分页结果
     *
     * @apiNote 注意：当前实现未添加校区过滤条件，
     *          可能需要根据实际业务逻辑补充校区查询条件
     */
    @Override
    public PageInfo<ShopInfo> queryBySchool(int page, int item) {
        // 开启分页功能
        PageMethod.startPage(page, item);

        // 查询所有店铺信息（未添加校区过滤条件）
        List<ShopInfo> shopInfos = shopInfoMapper.selectList(null);
/*        1. forEach 方法对集合中的每个元素执行指定操作
          2.el ->调用 setShopMasterId 方法修改店铺的店主 ID 字段
          3.JSON.toJSONString将 Java 对象转换为 JSON 格式字符串
          覆盖原来的店主 ID进行查询
 */
        // 为每个店铺设置shopMasterId字段为店主用户信息的JSON字符串
        shopInfos.forEach(el ->
                el.setShopMasterId(JSON.toJSONString(
                        userInfoService.getById(el.getShopMasterId())
                ))
        );
        // new PageInfo<>(orderForSenders) 会自动：
        //获取当前页数据（orderForSenders）
        //计算总记录数（通过执行 SELECT COUNT(*)）
        //计算总页数、当前页码等信息
        return new PageInfo<>(shopInfos);
    }
}